// 预加载脚本
// 将 Electron 的 process.versions 对象的选定属性公开给 versions 全局变量中的渲染器进程。
/**
 * 从 Electron 20 开始，预加载脚本默认被沙箱化，并且不再能够访问完整的 Node.js 环境。实际上，这意味着你拥有一个 polyfilled require 函数，它只能访问一组有限的 API。
    可用的 API	        细节
    Electron 模块	    渲染器进程模块
    Node.js 模块	    events、timers、url
    Polyfill 全局变量	Buffer、process、clearImmediate、setImmediate
 */

/**
 * 进程间通信 IPC
 * 原因：主进程和渲染进程之间的职责不同 主进程无法访问渲染进程的 DOM 渲染进程无法直接访问node.js的API 所以IPC诞生了
 * Electron 的 ipcMain 和 ipcRenderer 模块进行进程间通信（IPC）
 * 要将消息从网页发送到主进程，你可以使用 ipcMain.handle 设置主进程处理程序，然后公开一个调用 ipcRenderer.invoke 的函数以在预加载脚本中触发处理程序。
 */
const { contextBridge, ipcRenderer } = require('electron')
const electron = require('electron')

contextBridge.exposeInMainWorld('versions', {
    node: () => process.versions.node,
    chrome: () => process.versions.chrome,
    electron: () => process.versions.electron,
    // 警告：不要通过上下文桥公开整个ipcRenderer模块，这将使你的渲染器能够向主进程发送任意 IPC 消息，导致安全漏洞。
    ping: () => ipcRenderer.invoke('ping'),
    // 也可以公开变量，不仅仅是函数
    api: 'what are you 弄啥嘞！'
})